#pragma once

#include <sys_usb.h>
#include <util_usb_desc_base.h>

typedef enum {
	USB_DESC_EP_ISO_NONE = 0,
	USB_DESC_EP_ISO_ASYNC = 1,
	USB_DESC_EP_ISO_ADAPT = 2,
	USB_DESC_EP_ISO_SYNC = 3,
} usb_desc_ep_iso_type_e;

typedef enum {
	USB_DESC_EP_ISO_DATA = 0,
	USB_DESC_EP_ISO_FB = 1,
	USB_DESC_EP_ISO_IMPL_FB_DATA = 2,
} usb_desc_ep_iso_usage_e;

// 端点描述符
typedef struct {
	usb_desc_base_t base;		       // 描述符头
	u8_s ep_no : 4;			       // 端点号
	u8_s : 3;			       // 保留为0
	usb_dir_e dir : 1;		       // 方向
	usb_trans_type_e trans_type : 2;       // 端点类型
	usb_desc_ep_iso_type_e iso_type : 2;   // 同步传输类型
	usb_desc_ep_iso_usage_e iso_usage : 2; // 同步传输用途
	u8_s : 2;			       // 保留为0
	u16_s max_pkt_size : 11;	       // 最大包长度
	u16_s times : 2;		       // 仅高速模式使用
	u8_s : 3;			       // 保留为0
	u8_s interval;			       // 轮询间隔，单位：SOF周期。
} __attribute__((packed)) usb_desc_ep_t;

_Static_assert(sizeof(usb_desc_ep_t) == 7,
	       "Struct usb_desc_ep_t defined error!");
